package com.glodon.paas.document.dao;

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.glodon.paas.document.dao.domain.FileInfoEntity;

/**
 * @author admin
 */
public interface FileDao extends DBDao<FileInfoEntity, String> {

    static Logger logger = LoggerFactory.getLogger(FileDao.class);

    // ----------------------------------------------------------
    /**
     * 清空某人所有的数据，测试用， 未确保安全，这里限制ownerId.length<20
     */
    void cleanByOwnerId(String ownerId);

    /**
     * @param fileId
     * @param status
     * @param types
     * @return
     */
    FileInfoEntity getFile(String fileId, Integer[] status, Integer[] types);

    /**
     * @param parentId
     * @param path
     * @param status
     * @param types
     * @return
     */
    String getFileId(String parentId, String path, Integer[] status, Integer[] types);

    /**
     * @param parentId
     * @param name
     * @param status
     * @param types
     * @return
     */
    List<FileInfoEntity> getFiles(String parentId, String name, Integer[] status, Integer[] types);

    List<FileInfoEntity> getDeletedFiles(String ownerId);

    // /**
    // * @param userId
    // * @param fileId
    // * @return
    // */
    // String getFileOwner(String fileId);

    /**
     * @param userId
     * @param fileId
     * @return
     */
    // FileInfoEntity getRootDoc(String userId, String fullName);

    /**
     * @param parentId
     * @param folderName
     * @return
     */
    // FileInfoEntity getDocByParentName(String parentId, String fullName);

    /**
     * @param userId
     * @param fileId
     * @return
     */
    // FileInfoEntity getRootFolder(String userId, String folderName);

    /**
     * @param parentId
     * @param folderName
     * @return
     */
    // FileInfoEntity getFolderByParentName(String parentId, String folderName);

    /**
     * @param userId
     * @return
     */
    // List<FileInfoEntity> getRootFiles(String userId);

    /**
     * @param fileId
     * @return
     */
    // List<FileInfoEntity> getSubFiles(String fileId);

    /**
     * @param fileId
     * @return
     */
    // List<FileInfoEntity> getAllSubFiles(String fileId);

    /**
     * delete a user's FileInfoEntity to Recycle bin by its fileId
     * 
     * @param ownerId
     * @param fileId
     */
    void updateStatus(String fileId, Integer deleteType);

    /**
     * delete a user's FileInfoEntity by its fileId
     * 
     * @param ownerId
     * @param fileId
     */
    void delFile(String fileId);

    /**
     * @param userId
     * @return
     */
    // List<FileInfoEntity> getDeletedFiles(String userId);

    /**
     * @param userId
     * @return
     */
    // List<FileInfoEntity> getDeletedFiles(String userId, String fileName);

    /**
     * @param fileId
     * @return
     */
    // FileInfoEntity getDeletedFile(String userId, String fileId);

    /**
     * @param userId
     * @return
     */
    long getUsedSpace(String userId);

    /**
     * @param fileId
     * @param newName
     */
    void updateFileName(String fileId, String newName, String updator);

    /**
     * @param fileId
     * @param dataBagId
     */
    int updateDataBagId(String fileId, String dataBagId);

    /**
     * @param id
     * @param status
     */
    void updateShareType(String fileId, Integer type);

    /**
     * @param fileId
     * @param status
     */
    int updateParent(String fileId, String parentId);

    /**
     * @param fileId
     * @return
     */
    String getParentId(String fileId);

    /**
     * @param fileId
     */
    // void restore(String fileId);

    /**
     * @param fileId
     * @param revisionNum
     */
    void updateSizeNumCount(String fileId, long size, int num, int count, Date updateTime);

    // /**
    // * @param fileId
    // */
    // void decreaseCount(String fileId);
    /**
     * @param fileId
     */
    void refreshCount(String fileId);

    /**
     * @param fileId
     * @param count
     * @return
     */
    void updateCount(String fileId, int count);

    // /**
    // * @param ownerId
    // * @param parentId
    // * @param type
    // * @param deletedStatus
    // * @return
    // */
    // int count(String ownerId, String parentId, Integer type, Integer deletedStatus);

    // /**
    // * @param fileId
    // * @return
    // */
    // long getSize(String fileId);
    // top 1000
    List<FileInfoEntity> getExpiredFiles(String ownerId, int nDays, int limited);

    // /**
    // *
    // * @param ownerId
    // * @param parentId
    // * @param type
    // * @param available 有可用版本即activeRevision > 0
    // * @param deletedStatus
    // * @param orderProperty: name, extension, createTime
    // * @param orderType
    // * @param startIndex
    // * @param count
    // * @return
    // */
    // List<FileInfoEntity> selectByComplex(
    // String ownerId,
    // String parentId,
    // Integer type,
    // Integer deletedStatus,
    // String orderProperty,
    // Integer orderType,
    // Integer startIndex,
    // Integer count
    // );

    void updateUpdator(String fileId, String userId);

    void updateLock(String fileId, String lockId);
    
    FileInfoEntity getFileWithFolderCount(String fileId);
}
